package opencm;

import java.io.Serializable;

import org.apache.commons.lang3.Validate;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

public final class Endereco implements Serializable {

	private String rua = null;
	private String numero = null;
	private String complemento = null;
	private String bairro = null;
	private String cidade = null;
	private String estado = null;
	private String cep = null;
	
	private static final String FORMATO_CEP = "^\\d{5}-\\d{3}$";
	private static final long serialVersionUID = 1L;

	@Override
	public boolean equals(Object obj) {
		return EqualsBuilder.reflectionEquals(this, obj);
	}
	
	@Override
	public int hashCode() {
		return HashCodeBuilder.reflectionHashCode(this);
	}
	
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		if (getRua() != null) sb.append(getRua()).append(", ");
		if (getNumero() != null) sb.append(getNumero()).append(", ");
		if (getComplemento() != null) sb.append(getComplemento()).append(", ");
		if (getBairro() != null) sb.append(getBairro()).append(", ");
		if (getCidade() != null) sb.append(getCidade()).append(", ");
		if (getEstado() != null) sb.append(getEstado()).append(", ");
		if (getCep() != null) sb.append(getCep());
		return sb.toString();
	}
	
	/**
	 * Muda a rua do endereco.
	 * @param rua Nova rua.
	 */
	public void setRua(String rua) {
		this.rua = rua;
	}

	/**
	 * Retorna a rua do endereco.
	 * @return Rua
	 */
	public String getRua() {
		return this.rua;
	}

	/**
	 * Muda o numero do endereco.
	 * @param numero Novo numero.
	 */
	public void setNumero(String numero) {
		this.numero = numero;
	}

	/**
	 * Retorna o numero do endereco.
	 * @return Numero
	 */
	public String getNumero() {
		return this.numero;
	}

	/**
	 * Muda o complemento do endereco.
	 * @param complemento Novo complemento.
	 */
	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}

	/**
	 * Retorna o complemento do endereco.
	 * @return Complemento
	 */
	public String getComplemento() {
		return this.complemento;
	}

	/**
	 * Muda o bairro do endereco.
	 * @param bairro Novo bairro.
	 */
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	/**
	 * Retorma o bairro do endereco.
	 * @return Bairro
	 */
	public String getBairro() {
		return this.bairro;
	}

	/**
	 * Muda a cidade do endereco.
	 * @param cidade Nova cidade.
	 */
	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	/**
	 * Retorna a cidade do endereco.
	 * @return Cidade
	 */
	public String getCidade() {
		return this.cidade;
	}

	/**
	 * Muda o estado do endereco.
	 * @param estado Novo estado.
	 */
	public void setEstado(String estado) {
		this.estado = estado;
	}

	/**
	 * Retorna o estado do endereco.
	 * @return Estado
	 */
	public String getEstado() {
		return this.estado;
	}

	/**
	 * Muda o CEP do endereco.
	 * @param cep Novo CEP.
	 */
	public void setCep(String cep) {
		if (cep != null) {
			Validate.matchesPattern(cep, FORMATO_CEP, "Formato inválido.");
		}
		this.cep = cep;
	}

	/**
	 * Retorna o CEP do endereco.
	 * @return CEP
	 */
	public String getCep() {
		return this.cep;
	}
	
}